#include "util.hpp"
#include "config.hpp"
#include "data.hpp"
#include "hot.hpp"
#include "service.hpp"
#include <thread>

void FileUtilTest(const std::string &filename)
{
    // cloud::FileUtil fu(filename);
    // std::cout << fu.FileSize() << std::endl;
    // std::cout << fu.LastMtime() << std::endl;
    // std::cout << fu.LastAtime() << std::endl;
    // std::cout << fu.Filename() << std::endl;

    // cloud::FileUtil fu(filename);
    // std::string body;
    // fu.GetContent(&body);//获取文件内容，读取文件内容
    // cloud::FileUtil nfu("./hello.txt");
    // nfu.SetContent(body);//将body中的数据内容写到hello.txt文件中

    // std::string packname = filename + ".lz";
    // cloud::FileUtil fu(filename);
    // fu.Compress(packname);
    // cloud::FileUtil pfu(packname);
    // pfu.UnCompress("./hello.txt");

    // cloud::FileUtil fu(filename);
    // fu.CreateDirectory();
    // std::vector<std::string> arry;
    // fu.ScanDirectory(&arry);
    // for (auto &a : arry)
    // {
    //     std::cout << a << std::endl;
    // }

    return;
}

void DataTest(const std::string &filename) // 非常量，要加const
{
    // cloud::BackupInfo info;
    // info.NewBackupInfo(filename);
    // std::cout<<info.pack_flag<<std::endl;
    // std::cout<<info.fsize<<std::endl;
    // std::cout<<info.mtime<<std::endl;
    // std::cout<<info.atime<<std::endl;
    // std::cout<<info.real_path<<std::endl;
    // std::cout<<info.pack_path<<std::endl;
    // std::cout<<info.url<<std::endl;

    cloud::BackupInfo info;
    info.NewBackupInfo(filename);
    cloud::DataManager data;

    std::cout << "---------insert and GetOneByURL-----------\n";
    data.Insert(info);
    cloud::BackupInfo tmp;
    data.GetOneByURL("/download/bundle.h", &tmp); // 获取单个，根据url来获取
    std::cout << tmp.pack_flag << std::endl;
    std::cout << tmp.fsize << std::endl;
    std::cout << tmp.mtime << std::endl;
    std::cout << tmp.atime << std::endl;
    std::cout << tmp.real_path << std::endl;
    std::cout << tmp.pack_path << std::endl;
    std::cout << tmp.url << std::endl;

    std::cout << "---------update and getall-----------\n";
    info.pack_flag = true;
    data.Update(info);
    std::vector<cloud::BackupInfo> arry;
    data.GetAll(&arry); // 获取所有信息
    for (auto &a : arry)
    {
        std::cout << a.pack_flag << std::endl;
        std::cout << a.fsize << std::endl;
        std::cout << a.mtime << std::endl;
        std::cout << a.atime << std::endl;
        std::cout << a.real_path << std::endl;
        std::cout << a.pack_path << std::endl;
        std::cout << a.url << std::endl;
    }

    std::cout << "---------GetOneByRealPath-----------\n";
    data.GetOneByRealPath(filename, &tmp); // 根据实际路径查询
    std::cout << tmp.pack_flag << std::endl;
    std::cout << tmp.fsize << std::endl;
    std::cout << tmp.mtime << std::endl;
    std::cout << tmp.atime << std::endl;
    std::cout << tmp.real_path << std::endl;
    std::cout << tmp.pack_path << std::endl;
    std::cout << tmp.url << std::endl;

    // cloud::DataManager data;
    // std::vector<cloud::BackupInfo> arry;
    // data.GetAll(&arry); // 获取所有信息
    // for (auto &a : arry)
    // {
    //     std::cout << a.pack_flag << std::endl;
    //     std::cout << a.fsize << std::endl;
    //     std::cout << a.mtime << std::endl;
    //     std::cout << a.atime << std::endl;
    //     std::cout << a.real_path << std::endl;
    //     std::cout << a.pack_path << std::endl;
    //     std::cout << a.url << std::endl;
    // }
}

// void JsonUtilTese()
// {
//     const char *name = "小明";
//     int age = 19;
//     float score[] = {85, 85.5, 99};
//     Json::Value root;
//     root["姓名"] = name;
//     root["年龄"] = age;
//     root["成绩"].append(score[0]);
//     root["成绩"].append(score[1]);
//     root["成绩"].append(score[2]);
//     std::string json_str;
//     cloud::JsonUtil::Serialize(root, &json_str);//将序列化的数据放到json_str里
//     std::cout << json_str << std::endl;

//     Json::Value val;
//     cloud::JsonUtil::UnSerialize(json_str, &val);//将反序列化的数据放到val里
//     std::cout << val["姓名"].asString() << std::endl;
//     std::cout << val["年龄"].asInt() << std::endl;
//     for (int i = 0; i < val["成绩"].size(); i++)
//     {
//         std::cout << val["成绩"][i].asFloat() << std::endl;
//     }
// }

// void ConfigTest()
// {
//     cloud::Config *config = cloud::Config::GetInstance();//获取操作句柄
//     std::cout << config->GetHotTime() << std::endl;
//     std::cout << config->GetServerPort() << std::endl;
//     std::cout << config->GetServerIp() << std::endl;
//     std::cout << config->GetDownloadPrefix() << std::endl;
//     std::cout << config->GetPackFileSuffix() << std::endl;
//     std::cout << config->GetPackDir() << std::endl;
//     std::cout << config->GetBackDir() << std::endl;
//     std::cout << config->GetBackupFile() << std::endl;
// }

cloud::DataManager *_data;
void HotTest()
{
    _data = new cloud::DataManager();
    cloud::HotManager hot;
    hot.RunModule();
}

void ServiceTest()
{
    cloud::Service srv;//实例化一个对象
    srv.RunModule();
}
int main(int argc, char *argv[])
{
    _data = new cloud::DataManager();
    // FileUtilTest(argv[1]);
    // JsonUtilTese();
    // ConfigTest();
    // DataTest(argv[1]); // 常量
    // HotTest();
    // ServiceTest();
    
    //两个线程，各种运行模块功能
    std::thread thread_hot_manager(HotTest);//HotTest是一个死循环
    std::thread thread_service(ServiceTest);//ServiceTest也是一个死循环，应该流程里不能有多个死循环，所以用多线程
    thread_hot_manager.join();
    thread_service.join();
    return 0;
}